//给你三个正整数 a、b 和 c。 
//
// 你可以对 a 和 b 的二进制表示进行位翻转操作，返回能够使按位或运算 a OR b == c 成立的最小翻转次数。 
//
// 「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 
//
// 
//
// 示例 1： 
//
// 
//
// 输入：a = 2, b = 6, c = 5
//输出：3
//解释：翻转后 a = 1 , b = 4 , c = 5 使得 a OR b == c 
//
// 示例 2： 
//
// 输入：a = 4, b = 2, c = 7
//输出：1
// 
//
// 示例 3： 
//
// 输入：a = 1, b = 2, c = 3
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// 1 <= a <= 10^9 
// 1 <= b <= 10^9 
// 1 <= c <= 10^9 
// 
//
// Related Topics 位运算 👍 61 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2023-10-07 17:04:47
 * @description 1318.或运算的最小翻转次数
 */
public class MinimumFlipsToMakeAOrBEqualToC{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new MinimumFlipsToMakeAOrBEqualToC().new Solution();
		 System.out.println(1|5);
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 /*对于十进制数x
		 * 1.x&1，可以得到x的最后一位等价于x%2
		 * 2.x&(1<<k)，可以表示x的第k位是否是1，如果大于0.就是1
		 * 3.1&(x>>k)可以表示的第k，如果位数小于k，表达式等于0*/
    public int minFlips(int a, int b, int c) {
		int res=0;
		for (int i = 0; i<31; i++) {
			int t=1<<i;
				int a1=(a>>i)&1;
				int b1=(b>>i)&1;
				int c1=(c>>i)&1;
				if(c1==0){
					res+=a1+b1;
				}else {
					res+=(a1+b1==0?1:0);
				}
		}
		return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
